// Copyright 2014 The Flutter Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

import 'package:file/file.dart';
import 'package:file_testing/file_testing.dart';
import 'package:flutter_tools/src/base/io.dart';

import '../src/common.dart';
import 'test_utils.dart';

void main() {
  late Directory tempDir;

  setUp(() {
    tempDir = createResolvedTempDirectorySync('flutter_plugin_test.');
  });

  tearDown(() {
    tryToDelete(tempDir);
  });

  testWithoutContext('Flutter app that depends on a non-Android plugin can still build for Android', () {
    final String flutterRoot = getFlutterRoot();
    final String flutterBin = fileSystem.path.join(
      flutterRoot,
      'bin',
      'flutter',
    );
    processManager.runSync(<String>[
      flutterBin,
      ...getLocalEngineArguments(),
      'create',
      '-t',
      'plugin',
      '--platforms=ios,android',
      'ios_only',
    ], workingDirectory: tempDir.path);

    // Delete plugin's Android folder
    final Directory projectRoot = tempDir.childDirectory('ios_only');
    projectRoot.childDirectory('android').deleteSync(recursive: true);

    // Update pubspec.yaml to iOS only plugin
    final File pubspecFile = projectRoot.childFile('pubspec.yaml');
    final String pubspecString = pubspecFile.readAsStringSync();

    final StringBuffer iosOnlyPubspec = StringBuffer();
    bool inAndroidSection = false;
    const String pluginPlatformIndentation = '      ';
    for (final String line in pubspecString.split('\n')) {
      // Skip everything in the Android section of the plugin platforms list.
      if (line.startsWith('${pluginPlatformIndentation}android:')) {
        inAndroidSection = true;
        continue;
      }
      if (inAndroidSection) {
        if (line.startsWith('$pluginPlatformIndentation  ')) {
          continue;
        } else {
          inAndroidSection = false;
        }
      }
      iosOnlyPubspec.write('$line\n');
    }

    pubspecFile.writeAsStringSync(iosOnlyPubspec.toString());

    // Build example APK
    final Directory exampleDir = projectRoot.childDirectory('example');

    final ProcessResult result = processManager.runSync(<String>[
      flutterBin,
      ...getLocalEngineArguments(),
      'build',
      'apk',
      '--target-platform',
      'android-arm',
      '--verbose',
    ], workingDirectory: exampleDir.path);

    expect(result, const ProcessResultMatcher());

    final String exampleAppApk = fileSystem.path.join(
      exampleDir.path,
      'build',
      'app',
      'outputs',
      'apk',
      'release',
      'app-release.apk',
    );
    expect(fileSystem.file(exampleAppApk), exists);
  });
}
